﻿using Be.Timvw.Framework.ComponentModel;
using CristoRessuscitado.BancoDados;
using CristoRessuscitado.Utils;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace CristoRessuscitado.Formularios
{
    public partial class FormConsultaFuncoes : Form, IFormConsultaPadrao
    {
        private int                 idRegistroSelecionado;

        private DatabaseContext     dbContext;

        public FormConsultaFuncoes()
        {
            InitializeComponent();
        }

        // ---------------------------------------------------------------------------------------------------------------------------
        //
        // Eventos
        //
        // ---------------------------------------------------------------------------------------------------------------------------

        private void FormConsultarFuncoes_Load(object sender, EventArgs e)
        {
            Inicializar();
        }
        
        private void txtFiltroFuncao_TextChanged(object sender, EventArgs e)
        {
            Atualizar();
        }

        private void dgv_Sorted(object sender, EventArgs e)
        {
           LimparSelecaoRegistro();
        }

        private void FormConsultaFuncoes_KeyDown(object sender, KeyEventArgs e)
        {
            OnTecladoKeyDown(e);
        }

        private void dgv_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            // Recupera o id pelo índice na grid
            try
            {
                idRegistroSelecionado = Convert.ToInt32(dgv.Rows[e.RowIndex].Cells[0].Value);
            }
            catch (Exception)
            {
                idRegistroSelecionado = -1;
            }
        }

        private void dgv_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            if (idRegistroSelecionado != -1)
            {
                AbrirFormularioParaAlteracaoRegistro();
                Atualizar();
            }
            else
            {
                GeralUtils.ExibirDialogMsgValidacao(this, MensagensPadrao.txt_geral_selecione_registro_alterar);
            }
        }

        private void btnIncluir_Click(object sender, EventArgs e)
        {
            AbrirFormularioParaNovoRegistro();
            Atualizar();
        }

        private void btnAlterar_Click(object sender, EventArgs e)
        {
            if (idRegistroSelecionado != -1)
            {
                AbrirFormularioParaAlteracaoRegistro();
                Atualizar();
            }
            else
            {
                GeralUtils.ExibirDialogMsgValidacao(this, MensagensPadrao.txt_geral_selecione_registro_alterar);
            }
        }

        private void btnExcluir_Click(object sender, EventArgs e)
        {
            if (idRegistroSelecionado != -1)
            {
                if (ValidarExcluirRegistroSelecionado())
                {
                    ExcluirRegistroSelecionado();
                    Atualizar();
                }
            }
            else
            {
                GeralUtils.ExibirDialogMsgValidacao(this, MensagensPadrao.txt_geral_selecione_registro_excluir);
            }
        }

        // ---------------------------------------------------------------------------------------------------------------------------
        //                                                                                                                           
        // Métodos Auxiliares                                                                                                        
        //                                                                                                                           
        // ---------------------------------------------------------------------------------------------------------------------------

        public void OnTecladoKeyDown(KeyEventArgs e)
        {
            if (e.KeyCode == (Keys.Escape))
            {
                Close();
            }
        }

        public void Inicializar()
        {
            dbContext = new DatabaseContext();
            KeyPreview = true;

            Atualizar();
        }

        public void Atualizar()
        {
            // Filtro
            string nomeFuncao = tbFiltroNomeFuncao.Text.Trim();
            
            // Alimenta a Grid
            var lista = dbContext.Funcao.AsNoTracking().ToList();
            var listaFiltrada = lista.Where(e => e.Nome.StartsWith(nomeFuncao, StringComparison.InvariantCultureIgnoreCase)).ToList();

            var listaProjetada = from e in listaFiltrada
                                 select
                                    new
                                    {
                                        Id = e.IdFuncao,
                                        Funcao = e.Nome,
                                        Descricao = e.Descricao,
                                        QtdePessoas = e.Pessoa.Count
                                    };

            var listaOrdenavel = new SortableBindingList<Object>(listaProjetada);

            dgv.DataSource = listaOrdenavel;

            lblTotalRegistros.Text = MensagensPadrao.lbl_geral_total_registros + listaOrdenavel.Count;   

            // Configura a Grid
            GeralUtils.AplicarFormatacaoPadraoDGV(dgv);
            if (dgv.Rows.Count > 0)
            {
                dgv.Columns[0].Visible = false;
                dgv.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
                dgv.Columns[1].HeaderText = "Função";
                dgv.Columns[2].Visible = false;
                dgv.Columns[3].HeaderText = "Pessoas";
                dgv.Columns[3].ToolTipText = "Quantidade de pessoas que exercem esta função";
                dgv.Columns[3].Width = 75;
                dgv.Columns[3].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            }

            LimparSelecaoRegistro();
        }

        public void LimparSelecaoRegistro()
        {
            dgv.ClearSelection();
            idRegistroSelecionado = -1;
        }

        public void AbrirFormularioParaNovoRegistro()
        {
            FormCadFuncao form = new FormCadFuncao();
            form.ShowDialog(this);
        }

        public void AbrirFormularioParaAlteracaoRegistro()
        {
            FormCadFuncao form = new FormCadFuncao();
            form.FlagAlteracao = true;
            form.IdRegistro = idRegistroSelecionado;
            form.ShowDialog(this);
        }

        public void ExcluirRegistroSelecionado()
        {
            var funcaoSelecionada = dbContext.Funcao.Find(idRegistroSelecionado);
            dbContext.Funcao.Remove(funcaoSelecionada);
            dbContext.SaveChanges();    
        }

        public bool ValidarExcluirRegistroSelecionado()
        {
            var qtdePessoasDependentesQuery = dbContext.Database.SqlQuery<Int32>("select count(*) from PessoaFuncao where IdFuncao = @IdFuncao", new SqlParameter("@IdFuncao", idRegistroSelecionado));
            int qtdePessoasDependentes = qtdePessoasDependentesQuery.ToList()[0];
            if (qtdePessoasDependentes > 0)
            {
                GeralUtils.ExibirDialogMsgValidacao(this, "Não é possível excluir o registro selecionado. Existem pessoas vinculadas a esta função.");
                return false;
            }

            return true;
        }
    }
}
